"""
A股财务数据可视化工具 - Streamlit主应用
基于价值投资理念的资产负债表分析工具
"""

import streamlit as st
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime, timedelta
import sys
import os

# 添加模块路径
sys.path.append(os.path.dirname(__file__))

from data_processor import BalanceSheetProcessor
from visualization import BalanceSheetVisualizer


class FinancialAnalysisApp:
    """财务分析应用主类"""
    
    def __init__(self):
        self.processor = BalanceSheetProcessor()
        self.visualizer = BalanceSheetVisualizer()
        self.setup_page_config()
    
    def setup_page_config(self):
        """设置页面配置"""
        st.set_page_config(
            page_title="A股财务数据可视化分析工具",
            page_icon="📊",
            layout="wide",
            initial_sidebar_state="expanded"
        )
        
        # 自定义CSS样式
        st.markdown("""
        <style>
        .main-header {
            font-size: 2.5rem;
            color: #1f77b4;
            text-align: center;
            margin-bottom: 2rem;
        }
        .metric-card {
            background-color: #f0f2f6;
            padding: 1rem;
            border-radius: 0.5rem;
            border-left: 4px solid #1f77b4;
        }
        .score-excellent { color: #28a745; font-weight: bold; }
        .score-good { color: #17a2b8; font-weight: bold; }
        .score-average { color: #ffc107; font-weight: bold; }
        .score-poor { color: #dc3545; font-weight: bold; }
        </style>
        """, unsafe_allow_html=True)
    
    def run(self):
        """运行主应用"""
        # 页面标题
        st.markdown('<h1 class="main-header">📊 A股财务数据可视化分析工具</h1>', 
                   unsafe_allow_html=True)
        st.markdown('<p style="text-align: center; color: #666;">基于价值投资理念的专业财务分析平台</p>', 
                   unsafe_allow_html=True)
        
        # 侧边栏控制面板
        self.render_sidebar()
        
        # 主内容区域
        if 'stock_code' in st.session_state and st.session_state.stock_code:
            self.render_main_content()
        else:
            self.render_welcome_page()
    
    def render_sidebar(self):
        """渲染侧边栏"""
        st.sidebar.header("🎯 分析控制面板")
        
        # 股票选择器
        st.sidebar.subheader("股票选择")
        stock_code = st.sidebar.text_input(
            "请输入股票代码",
            placeholder="例如：000001, 600519",
            help="支持6位A股代码，系统会自动识别市场"
        )
        
        # 股票代码验证和格式化
        if stock_code:
            formatted_code = self.format_stock_code(stock_code)
            if formatted_code:
                st.session_state.stock_code = formatted_code
                st.sidebar.success(f"已选择: {formatted_code}")
            else:
                st.sidebar.error("请输入有效的6位股票代码")
        
        # 分析参数设置
        st.sidebar.subheader("分析参数")
        
        # 时间范围选择
        time_range = st.sidebar.selectbox(
            "分析时间范围",
            ["最近1年", "最近3年", "最近5年"],
            index=1
        )
        st.session_state.time_range = time_range
        
        # 报告期类型
        report_type = st.sidebar.multiselect(
            "报告期类型",
            ["年报", "半年报", "季报"],
            default=["年报", "半年报"]
        )
        st.session_state.report_type = report_type
        
        # 数据刷新控制
        st.sidebar.subheader("数据管理")
        if st.sidebar.button("🔄 刷新数据", help="强制从服务器获取最新数据"):
            if 'stock_code' in st.session_state:
                self.refresh_data()
        
        # 功能说明
        with st.sidebar.expander("💡 功能说明"):
            st.markdown("""
            **主要功能：**
            - 📈 资产负债表可视化分析
            - 🎯 价值投资评分系统
            - ⚠️ 财务风险预警
            - 📊 关键指标趋势分析
            
            **价值投资理念：**
            - 基于巴菲特选股标准
            - 格雷厄姆安全边际分析
            - 长期价值导向评估
            """)
    
    def render_main_content(self):
        """渲染主内容区域"""
        stock_code = st.session_state.stock_code
        
        # 数据加载
        with st.spinner(f"正在加载 {stock_code} 的财务数据..."):
            data = self.load_financial_data(stock_code)
        
        if data is None or data.empty:
            st.error("无法获取财务数据，请检查股票代码或网络连接")
            return
        
        # 股票基本信息
        self.render_stock_info(stock_code)
        
        # 价值投资评分卡片
        self.render_value_score_cards(data)
        
        # 主要图表区域
        self.render_main_chart(data, stock_code)
        
        # 详细分析区域
        col1, col2 = st.columns(2)
        
        with col1:
            self.render_key_metrics(data)
        
        with col2:
            self.render_risk_warnings(data)
        
        # 数据表格
        self.render_data_table(data)
    
    def render_welcome_page(self):
        """渲染欢迎页面"""
        col1, col2, col3 = st.columns([1, 2, 1])
        
        with col2:
            st.markdown("""
            ### 🎯 价值投资分析工具
            
            本工具基于价值投资理念，为A股投资者提供专业的财务分析服务：
            
            #### 🔍 核心功能
            - **资产负债表可视化**：直观展示公司财务结构
            - **价值投资评分**：基于巴菲特、格雷厄姆理念的综合评估
            - **风险预警系统**：及时发现财务风险信号
            - **趋势分析**：多期财务数据的对比分析
            
            #### 📊 分析维度
            - **资产质量**：现金比例、应收账款、存货周转等
            - **财务安全**：资产负债率、流动比率、偿债能力等
            - **成长潜力**：资产增长率、盈利能力趋势等
            
            #### 🚀 开始使用
            请在左侧面板输入股票代码开始分析
            """)
            
            # 示例股票快速选择
            st.markdown("#### 🌟 热门股票快速选择")
            example_stocks = {
                "贵州茅台": "600519",
                "平安银行": "000001", 
                "招商银行": "600036",
                "万科A": "000002"
            }
            
            cols = st.columns(len(example_stocks))
            for i, (name, code) in enumerate(example_stocks.items()):
                with cols[i]:
                    if st.button(f"{name}\n{code}", key=f"example_{code}"):
                        st.session_state.stock_code = code
                        st.experimental_rerun()
    
    def render_value_score_cards(self, data):
        """渲染价值投资评分卡片"""
        st.subheader("🎯 价值投资评分")
        
        # 计算评分
        categorized_data = self.processor.categorize_accounts(data)
        metrics = self.processor.calculate_key_metrics(categorized_data)
        scores = self.processor.calculate_value_score(metrics, categorized_data)
        
        # 评分卡片
        col1, col2, col3, col4 = st.columns(4)
        
        with col1:
            self.render_score_card(
                "综合评分", 
                scores['comprehensive_score'], 
                scores['grade'],
                "整体投资价值评估"
            )
        
        with col2:
            self.render_score_card(
                "资产质量", 
                scores['asset_quality_score'], 
                self.get_score_level(scores['asset_quality_score']),
                "资产结构与质量分析"
            )
        
        with col3:
            self.render_score_card(
                "财务安全", 
                scores['safety_score'], 
                self.get_score_level(scores['safety_score']),
                "偿债能力与财务稳定性"
            )
        
        with col4:
            self.render_score_card(
                "成长潜力", 
                scores['growth_score'], 
                self.get_score_level(scores['growth_score']),
                "业务增长与发展前景"
            )
    
    def render_score_card(self, title, score, grade, description):
        """渲染单个评分卡片"""
        color_class = self.get_score_color_class(score)
        
        st.markdown(f"""
        <div class="metric-card">
            <h4>{title}</h4>
            <h2 class="{color_class}">{score:.1f}分</h2>
            <p><strong>等级：{grade}</strong></p>
            <p style="font-size: 0.9em; color: #666;">{description}</p>
        </div>
        """, unsafe_allow_html=True)
    
    def render_main_chart(self, data, stock_code):
        """渲染主要图表"""
        st.subheader("📊 资产负债表结构分析")
        
        # 创建图表
        stock_info = {'name': '股票名称', 'code': stock_code}  # 实际应用中从API获取
        fig = self.visualizer.create_balance_sheet_chart(data, stock_info)
        
        # 显示图表
        st.plotly_chart(fig, use_container_width=True)
        
        # 图表说明
        with st.expander("📖 图表说明"):
            st.markdown("""
            **图表解读：**
            - **蓝色区域**：资产部分，显示公司拥有的各类资产
            - **红色区域**：负债部分，显示公司的债务情况
            - **绿色区域**：所有者权益，显示股东权益构成
            
            **分析要点：**
            - 资产结构是否合理（流动性与盈利性平衡）
            - 负债水平是否可控（关注资产负债率）
            - 权益结构是否稳定（关注未分配利润比例）
            """)
    
    def render_key_metrics(self, data):
        """渲染关键指标"""
        st.subheader("📈 关键财务指标")
        
        categorized_data = self.processor.categorize_accounts(data)
        metrics = self.processor.calculate_key_metrics(categorized_data)
        
        # 指标展示
        metric_data = {
            "资产负债率": f"{metrics['asset_liability_ratio']:.2%}",
            "流动比率": f"{metrics['current_ratio']:.2f}",
            "权益比率": f"{metrics['equity_ratio']:.2%}",
            "总资产": f"{metrics['total_assets']/100000000:.2f}亿元"
        }
        
        for metric, value in metric_data.items():
            st.metric(metric, value)
    
    def render_risk_warnings(self, data):
        """渲染风险预警"""
        st.subheader("⚠️ 风险预警")
        
        # 这里应该实现具体的风险分析逻辑
        st.info("暂无重大风险预警")
    
    def render_data_table(self, data):
        """渲染数据表格"""
        with st.expander("📋 详细财务数据"):
            st.dataframe(data, use_container_width=True)
    
    def render_stock_info(self, stock_code):
        """渲染股票基本信息"""
        col1, col2, col3 = st.columns([2, 1, 1])
        
        with col1:
            st.markdown(f"### 📈 {stock_code} - 股票名称")
        
        with col2:
            st.metric("当前股价", "¥XX.XX", "±X.XX%")
        
        with col3:
            st.metric("市值", "XXX亿", "")
    
    def format_stock_code(self, code):
        """格式化股票代码"""
        if len(code) == 6 and code.isdigit():
            return code
        return None
    
    def get_score_level(self, score):
        """获取评分等级"""
        if score >= 90:
            return "优秀"
        elif score >= 80:
            return "良好"
        elif score >= 60:
            return "一般"
        else:
            return "较差"
    
    def get_score_color_class(self, score):
        """获取评分颜色样式类"""
        if score >= 80:
            return "score-excellent"
        elif score >= 60:
            return "score-good"
        elif score >= 40:
            return "score-average"
        else:
            return "score-poor"
    
    def load_financial_data(self, stock_code):
        """加载财务数据"""
        try:
            return self.processor.get_balance_sheet_data(stock_code)
        except Exception as e:
            st.error(f"数据加载失败: {e}")
            return None
    
    def refresh_data(self):
        """刷新数据"""
        if 'stock_code' in st.session_state:
            with st.spinner("正在刷新数据..."):
                self.processor.get_balance_sheet_data(
                    st.session_state.stock_code, 
                    force_refresh=True
                )
            st.success("数据刷新完成！")


def main():
    """主函数"""
    app = FinancialAnalysisApp()
    app.run()


if __name__ == "__main__":
    main()
